23

» WarCraft 3 / Wait

Похожие вопросы:

ответ
Эта сволочь продолжает работать при паузах
Разве? :hmm: Часто проверял эту ерунду на работу в паузах, положительный результат не давало.
Вейт плох своей неточностью, могут быть отклонения по несколько миллисек.
Вейт 0.00 сек = вейту 0.10 сек, при этом неточности не будет, он будет ровно 0.1
Вейт нельзя запаузить как таймер или остановить, вейт паузит действия триггера, что идут после него.
Использовать вейт или нет - всегда зависит от ситуации. В основном его удобно юзать, когда не будет проблемы обращения к объекту вызвавшему событие.

Например юнит произнёс спелл
убрать эффект [номер юнита или игрока]
Создать спецэффект на юните
присвоить эффект [номер юнита или игрока] = этот эффект
вейт 2.5 сек
убрать эффект [номер юнита или игрока]
  • создавать определённый эффект на юните на время...

Или во время махинаций с предметами, скиллами, морфами и т.п. могут случаться баги из-за мгновенной обработки и часто там можно влепить вейт 0.00 сек, который не принесёт проблем, а пользу принесёт.
ответ
в четвёртый аргумент надо вписывать функцию которую ты хочешь вызвать
функция должна быть takes nothing returns nothing
таймер не замена вейта
просто многие люди пытаются заменить таймер вейтом
и вопрос закрыть не забудь
ответ
Сама функция TriggerSleepAction (Wait) не вызывает утечек, но багнута и при использовании в качестве задержек может способствовать утечкам, поэтому никаких вейтов в спеллах и всяких респаунах - только таймеры, вейты нужны для синхронизации данных и роликов и точка!
ответ
Steal nerves:
переходишь на jass? немного посмотри примеры и почитай статьи. набери в поиск таймеры + хэш-таблица и прочее
раскрыть
На триггерах это будет глупо и неудобно. Нужно создать или хотя бы иметь существующий таймер, потом запустить в определенный момент. Но для начала нужно сохранить данные, с которыми будешь взаимодействовать (например, юнит). К примеру дали пассивный скилл, через 5 минут удалил.
есть несколько способов, это запускать таймер. А другим триггером отлавливать с помощью события завершения времени таймера. Или вызывать напрямую функцию.
используется нативка
native TimerStart takes timer whichTimer, real timeout, boolean periodic, code handlerFunc returns nothing
или это. здесь функцию не вызывают, а просто запускают таймер. Завершение таймера отлавливают с помощью другого триггера. Очень неудобно
function StartTimerBJ takes timer t, boolean periodic, real timeout returns timer
    set bj_lastStartedTimer = t
    call TimerStart(t, timeout, periodic, null)
    return bj_lastStartedTimer
endfunction

23

» WarCraft 3 / Циклы

Похожие вопросы:

ответ
TAHK90:
убери действие for integer B
заведи себе переменную типа integer с именем count
далее выбираешь всех юнитов в группе
с каждым действием count увеличивай на 1
делаешь нужные действия если count меньше 2
если равен или больше - устаналивай на 0 и очищай группу
ответ
в гуи есть триггер-добавить событие
в триггере с событием инициализация 
если триггерная область == null (нету области)
	пробегаем циклом по массиву областей
	триггер - добавить событие этому триггеру (Юнит входит в область (Rect[А]))
иначе
	делаем то что надо делать при входе в 1 из 50 областей
иначе никак
ответ
~16GB:
ты что делаешь новые функции для гуи? если да, то нафига?
ответ
Custom script: exitwhen true
ответ
Лимит операций примерно 4 к. А у тебя тут поболее 16к.
Обойти лимит операций можно только разнеся действия в разные потоки. К примеру для через таймер.

23

» WarCraft 3 / Москиты

Похожие вопросы:

ответ
Москиты - невыделяемы. Невозможно.
ответ
Москиты не рассматриваются event units in range и GroupEnum###units, москиты можно выбрать только EventUnitsofplayer.
ответ
В теории, да - будут работать.
На практике - лучше проверь, это вар, тут возможно все.
ответ
Ааа, ну тогда смотри
не_кликабельность Сларка делается так
а - его морфят в юнит без модельки
б - ему дают москитов и отбирают (что бы на него нельзя было кликнуть, но можно было выделить)
в - все события "атакован" приводятся к действию "стоп", если это Сларк
г - аура регена игнорирует то что Сларка видят
у тебя на пути стоит пункт Б, т.к. что бы умные люди не заменяли себе пустую модельку (пункт А) на нормальную и не могли на неё в итоге тыкать... Так что в итоге - ты можешь её заменить, но тыкнуть всё равно не сможешь... шах и мат
ответ
найти в разделе действий с юнитами приказ без цели crypt lord - locust swarm

23

» WarCraft 3 / Интерфейс

Похожие вопросы:

ответ
Только что мелькал такой вопрос. Нет, нельзя.
ответ
Cimatic mode - убирает все элементы интерфейса, ну а там уже делай что хочешь когда зашипишишь фрапсом видео.
ответ
Движок вц3 в чистом виде не отрисовывает игру под интерфейсом, средствами, которые можно импортировать в карту, это не излечить.
ответ
Да, но работать будет только у того, у кого установлена данная модификация.
сделать некоторые части интерфейса некликабельными
Для этого можно использовать данную функцию, предварительно проверяя координаты курсора:
native void BlockMouse(bool bBlock) // Блокирует входные сообщения от мыши (перемещение, нажатия), передаваемые в игру
В карте приведён пример использования данной функции.
ответ
Заменим, только без внешнего софта новые элементы не добавить, но стандартыне редактируются в FDF

23

» WarCraft 3 / Описание предметов

Похожие вопросы:

ответ
можно либо заменять юнита, либо химичить с тексттагами(то есть сделать систему имен игровых обьектов на тексттагах), ещё есть функция для смены имени игрока
код
native SetPlayerName            takes player whichPlayer, string name returns nothing
предметам имена изменять нельзя
способности могут быть с таким же успехом удалены, добавлены
этим
native UnitAddAbility               takes unit whichUnit, integer abilityId returns boolean

native UnitRemoveAbility            takes unit whichUnit, integer abilityId returns boolean
подробнее насчет предметов, думаю можно похимичить с кастом велью, устанавливать его
функциями
native          SetItemUserData takes item whichItem, integer data returns nothing

native          GetItemUserData takes item whichItem returns integer
и
функциями
native S2I  takes string s returns integer

native I2S  takes integer i returns string
конвертировать, потом выводить строки на экран через
это
native DisplayTextToPlayer          takes player toPlayer, real x, real y, string message returns nothing
с таким же успехом можно использовать хеш-таблицы, для аттача описания к чему-либо.
Ещё есть вариант, с описанием предметов и способностей в квестах.
В общем без гемора, и написания левых систем никак)
ответ
Для большого описания нужно заменять кириллические буквы на аналогичные английские. о на o и т.д.
Кириллица в варике занимает места побольше.
ответ
Lana Guerrero, FSGUI или DGUI в помощь.
ответ
100500 раз уже спрашивалось. Заменяй кириллические символы на похожую латиницу. Если лень исправлять блокнотом - могу скинуть war3rainbow, там есть функция автозамены на латин.
ответ
Каждая буква кирилицой занимает 2 символа на английском

23

» WarCraft 3 / Почему пропали модели?

Похожие вопросы:

ответ
Миханчик
Возможно восстановление карты, после её удаления?
После удаления - пользуйся программой для восстановления удаленных файлов, например Magic Recovery
после ввода кода в карту, он пропал. Может я просто не сохранил карту или не знаю почему...
Насколько я понял речь про архив карты. Пропасть он мог только в случаях:
  1. ты его не добавил
  2. файллист изменился после добавления

23

» WarCraft 3 / Библиотеки

Похожие вопросы:

ответ
Нажми, как показано на скриншоте, и там будет "нестандартный код"
ответ
vjass manual:
Также библиотеки могут ссылаться на другие за счет следующей конструкции:
Код:
library A uses B
endlibrary
Это значит, что в библиотеки А содержится функция, вызывающая функцию в библиотеке В, следовательно библиотека В будет размещена выше по коду.
ответ
что значит обращаться?
к библиотеке как к объекту обращаться нельзя ибо библиотека это не объект а лишь область кода
обращаться можно лишь к не приватным функциям и переменных из библиотеки
советую перечитать что такое библиотека либо научиться правильно формулировать свои вопросы
ответ
Всё, разобрался, вопрос снимаю)

23

» WarCraft 3 / Вопрос про таймер

Похожие вопросы:

ответ
конечно
пруф
а вообще можно вспомнить кампанию людей - там есть миссия по защите Стратхольма, или как та деревня называлась - и там есть таймер, который нормально сохраняется
ответ
Он вроде как спрашивает, не остается ли что-либо в памяти игры или на карте. По-моему ничего не остается, удаляя юнита таким образом мы его навсегда выбрасываем.
ответ
Друга зачем? Нинада, так толку не будет...
Просто используешь Inject main (vjass) или Define (Cjass) чтобы убрать 1 только строчку из main
//***************************************************************************
//*
//*  Map Configuration
//*
//***************************************************************************

//***************************************************************************
//*
//*  Main Initialization
//*
//***************************************************************************

//===========================================================================
function main takes nothing returns nothing
    call SetCameraBounds(- 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), - 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM))
    call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
    call NewSoundEnvironment("Default")
    call SetAmbientDaySound("SunkenRuinsDay")
    call SetAmbientNightSound("SunkenRuinsNight")
    call SetMapMusic("Music", true, 0)
    call InitBlizzard() // вот и все, удалим и не будет бж объектов.


    call InitGlobals()
    call InitCustomTriggers()
    call RunInitializationTriggers()

endfunction
Совсем забыл, функция main генерируется при сохранении карты в редакторе
Без cjass или vjass придется выколупывать war3map.j (код карты) файл из карты и править ручками в блокнотике, геморойно до безобразия, за то ненужен c\vjass и его знания.
ответ
создаём юнита
даём юниту таймер
и проверяем что с ним стало
офигиваем от того что выяснили это сами
и не задаём тупых вопросов
на 4 дня пропал и уже 69 тупых вопросов
ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.

23

» WarCraft 3 / Вопрос о функциях

Похожие вопросы:

ответ
silence_AZ,
Вот вам пример, идите разбирайте его и читайте все статьи, что есть.
function UnitAddEffect takes unit u, real x, real y returns nothing
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl", x, y))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX(u), GetUnitY(u)))
endfunction

function Action takes nothing returns nothing
    local unit u = GetOrderedUnit()
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    call UnitAddEffect(u, x, y)
endfunction

function InitTrig_Effect takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
        set i = i + 1
        exitwhen i == 16
    endloop
    call TriggerAddAction( t, function Action )
endfunction
Создайте триггер "Effect", конвертируйте в текст, удалите все что там есть, копирните и вставьте мое, запускайте карту и побегайте юнитами.
То что я написал можно и нужно оптимизировать, но так как вам нужен пример создания пользовательский функций, то я сделал именно так.
Вот на всякий случай оптимизированный вариант.
cJass
    define{
        func = function
        void = nothing
        GetX(u) = GetUnitX(u)
        GetY(u) = GetUnitY(u)
        //Constants
        Effect_OnUnit = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
        Effect_OnXY = "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl"
    }

    void Action(){
        unit u = GetOrderedUnit();
        DestroyEffect(AddSpecialEffect(Effect_OnXY, GetOrderPointX(), GetOrderPointY()));
        DestroyEffect(AddSpecialEffect(Effect_OnUnit, GetX(u), GetY(u)));
    }

    void InitTrig_Effect(){
        trigger t = CreateTrigger()
        integer i = 0
        loop{
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null);
            i++;
            exitwhen i == 16;
        }
        TriggerAddAction( t, func Action );
    }
этот вариант будет оптимальнее в туче кода, хоть такая фигня и не нужна никому, но тем не менее..
ответ
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
ответ
Стоп, я думал ты именно это и проверял...
Ещё есть вариант - тревога это реакция нейтральных монстров на то, что недалеко от них появилось здание (когда начинаешь строить здание, и тут из леса прибегают нейтралы, ломают, и убегают обратно).
первая проверка - мб эта функция делает так что данный нейтрал игнорирует то что рядом с ним появится здание, и он в итоге не побежит его атаковать
вторая проверка - возможно функция делает само здание игнорируемым для этих нейтралов, т.е. конкретно на него не будут сбегаться ближайшие нейтралы
Но я больше склоняюсь к первому

23

» WarCraft 3 / Как сделать атаку юнита по области?

Похожие вопросы:

ответ
Готово!
ответ
Sargaraser, эт проблема сиденья с телефона -'фиг попадешь по нужной ссылке
А по теме поиск творит чудеса , за 3 минуты поиска нашел 10 тем с таким вопросом и в каждой есть решение
ответ
А приказ остановиться не пробовали?
ответ
The Dude, это несерьезно. Все вопросы описаны в большом количестве статей здесь, на нашем сайте - xgm.guru/p/wc3/articles. То, что перечисляешь не верх мастерства WE, а базовые знания. Материалов предостаточно. Успехов в обучении.
ответ
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.

23

» WarCraft 3 / Об утечках

Похожие вопросы:

ответ
Попробуй call DestroyGroup(udg_UNOSITMENIA) выбор юнитов тоже создаёт утечки.
ответ
лень учить джасс но не лень 2 часа тыкаться с гуи
короче тут всё ясно
ответ на вопрос
статей про "правильное гуи" на этом сайте нету
иногда куски с гуи встречаются в статьях про джасс так что можешь прочесть статьи про джасс
но вообще посмотри
тем кто не хочет красивое гуи не смотреть
ответ
наличия триггера на получение урона для каждого юнита
так делать нельзя
это же полный бред
просто добавляем событие к уже существующему триггеру вот и всё
нормального сборщика мусора в варе нет и скорее всего не будет(если близы даже рб поленились убрать то о нормальном gc можно забыть)
так же не стоит забывать что сборщик мусора срабатывает не сразу
если мне не изменяет память то save сохраняет объекты и значения переменных
а при загрузке восстанавливает связи (заносит значения в переменные, регистрирует события и прочее)
так что всякий мусор просто не проходит
а вообще лучше забей на это
в варе есть более серьёзные утечки от которых нельзя избавиться
например руны
+ создание и удаление триггеров вредит намного больше чем пара сотен килобайт памяти
да и вряд ли у тебя за игру будет 50к юнитов
ответ
Obelick, эта либо не трогает мультибоарды
она по точкам(location) в основном работает
Obelick:
учить ради них джас и переписывать мне настолько лень
если ты нормально знаешь гуи и имеешь базовые знания по использованию гугл переводчика то переписать мультибоард на jass много времени не займёт
кроме того тебе не обязательно переписывать полностью
можно сконвертировать в код и поправить то что вызывает утечки
если ты говоришь об утечках в функции установки значения ячейки мультибоарда то их можно убрать следующим кодом
define MultiboardSetItemValueBJ(mb,col,row,val)=myMultiboardSetItemValue(mb,col,row,val)

void myMultiboardSetItemValue(multiboard mb, integer col, integer row, string val){
    multiboarditem mbitem = MultiboardGetItem(mb, row-1, col-1)
    MultiboardSetItemValue(mbitem, val)
    MultiboardReleaseItem(mbitem)
    mbitem=null
}
вставь его в шапку карты (туда где ты ALL.j подключал)
правда после этого автозаполнение строк/столбцов перестанет работать и придётся делать его циклом

23

» WarCraft 3 / Количество ударов

Похожие вопросы:

ответ
Как это реализовано тогда?!
"В личном порядке".
Занесена базовая атака героя, учтено, сколько книжек на урон герой "съел", какие способности изучил, какие предметы одел, в идеале - какие баффы какого уровня получил. Хотя скорее всего описание врёт и сделано всё попроще - от главного атрибута или типа того, чтобы примерно равнялось 50% атаки. Если нужен костыль такого заклинания - могу скинуть, но надёжность оставляет желать лучшего. Но в наработке исправно наносится в заклинании урон по величине атаки героя, правда без учета баффов и преметов, только уровня.
Farrien:
У меня появилась идея,
Если нужно -могу подогнать системку, ловящую перехват смены приказа, она не блещет точностью, но абузить шансовые эффекты точно не получится.
ответ
Ты добавлял кости? Или через "повышение урона (улучшение)"? Значение последнего у юнита помечено — это добавится "базовый урон".
ответ
Ох уж эти отловы урона
ответ
не стоит использовать ждать
создаём для юнита целочисленную переменную time
1 триггер
 Событие 
 	периодическое событие - каждые 0.1 сек.-
 Условие 
	time > 0
Действие  
	set time = time - 1
	если time == 0 то понизить уровень способности "незаметность" для "герой" до 1
	
2 триггер
 Событие
	боевая единица - юнит атакован
 Условие
	Атакующий юнит=герой или Атакованный юнит=герой
 Действие
	set time=30
	боевая единица - повысить уровень способности "незаметность" для "герой" до 2
не забудь закрыть вопрос (для этого выбери лучший ответ)

23

» WarCraft 3 / Аура

Похожие вопросы:

ответ
Аура торнадо.
Аура выносливости с отрицательными значениями и врагами в допустимых целях.
ответ
XGM Bot:
Похожие вопросы:

ответ
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
ответ
пиши свою систему баффов
это не так сложно как кажется
просто вешай бафы дамикастом/спелбуком а потом удаляй при необходимости
Mrachny, как же ты надоел писать всякий бред
ты получаешь удовольствие от того что путаешь других людей?
или ты просто не способен осознать что несёшь полную ерунду?

ответ
Периодически давать крит всем с баффом ауры и убирать всем без нее. Владелец ауры нас по идее вообще не волнует.
ответ
ClotPh, при наличие 20-30 юнитов под бафом лаги обеспечены
аффтару
делай как писали выше
пикаем всех юнитов(кроме дамми херни) и проверяем наличие бафа и если баф есть даём спел на повышение макс хп одновременно запоминая юнита
когда баф потерян убираем повышение макс хп
ответ
Нет. Либо процент, либо интовое, либо вещественное округленное. Если надо вещественное неокругленное, то забивай вручную

23

» WarCraft 3 / Как отследить атакующего юнита?

Похожие вопросы:

ответ
Это приказ smart.
ответ
Событие такое есть, в гуях Особый юнит обнаружил цель в пределах досягаемости.
в jass это EVENT_UNIT_TARGET_IN_RANGE на конкретного юнита.
ответ
Smart - работает, но с атакой - нет. Юнит по-прежнему подбегает к врагу и начинает его бить. А должен был уже на пол пути остановиться :/
Всё зависит от событие.
Smart работает, когда событие с точка обьект.

23

» WarCraft 3 / атака

Похожие вопросы:

ответ
Область поражения будет не округлой а эпилептической, смещенной на некоторое расстояние вперед, чтобы добится эффекта как от волны силы, чтобы поражать врагов позади цели атаки.
ответ
Вообще в мемхаке есть же.
Но новички в картостроительстве, большинство серверов и отчасти последний патч варкрафта в мемхак не понимают.
ответ
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.